package org.az.netty_study.p01_nio组件之buffer;

import org.az.netty_study.ByteBufferUtil;

import java.nio.ByteBuffer;

public class _3_buffer的读写方法 {
    public static void main(String[] args) {
        //分配10个字节的ByteBuffer
        ByteBuffer buffer = ByteBuffer.allocate(10);
        /**
         * 写入，ByteBuffer初始状态就是写入模式
         * 此时position为0(下一个被写入字节就放在索引为0的位置)，limit为buffer长度
         */
        //向buffer写入数据有两种:1)直接向buffer里put; 2)buffer从channel里read;
        buffer.put((byte) 0x61);    //a
        ByteBufferUtil.debugAll(buffer);
        buffer.put(new byte[]{(byte) 0x62, (byte) 0x63, (byte) 0x64});
        ByteBufferUtil.debugAll(buffer);    //b,c,d

        /**
         * 读取(不flip的话，position指针指向索引4，而索引4对应的数据是0，因为前面只填充了0,1,2,3)
         * flip本质就就是将position指针设为0，limit指针设为之前写入的最后一个数据的下一个索引位置(4)
         */
        buffer.flip();
        ByteBufferUtil.debugAll(buffer);
        //从buffer读取数据有两种:1)直接从buffer里get; 2)channel从buffer里write;
        System.out.println((char) buffer.get());
        ByteBufferUtil.debugAll(buffer);

        /**
         * 上面读取了一个字节a，position指向索引1，b,c,d均未读
         * 写入模式之compact方法:可以将未读的数据全部前移，position指向能够写入的第一个索引，limit设为buffer长度
         * 此时position指向3，表示下一个写入的字节将被写入到索引为3的位置
         */
        buffer.compact();
        ByteBufferUtil.debugAll(buffer);

        /**
         * 写入模式之clear方法:能让buffer恢复到初始状态(position为0，limit为buffer长度)
         */
        buffer.clear();
        ByteBufferUtil.debugAll(buffer);
    }
}
